package com.chaofan.authsso.core;

import cn.hutool.core.util.StrUtil;
import com.chaofan.authsso.core.common.Constant;
import com.chaofan.authsso.core.properties.SsoCoreProperties;
import com.chaofan.authsso.core.service.CacheInstance;
import com.chaofan.authsso.core.util.CacheKeyUtil;
import org.springframework.beans.factory.annotation.Autowired;

import javax.servlet.http.HttpSession;

/**
 * Author: Chaofan
 * Date: 2020/6/8 11:04
 * email: chaofan2685@qq.com
 */
public class AuthSsoCore {

    @Autowired
    SsoCoreProperties properties;

    @Autowired
    HttpSession session;

    @Autowired
    CacheInstance cacheInstance;

    /**
     * 登录验证结束后,以token为key,用户信息为value,存入缓存,使用户信息和token关联起来
     * token的有效期为配置文件中配置的有效期(未配置则为默认有效期1800秒)
     * @param parameter 与登录用户相关的信息,比如用户id
     * @return 返回回跳地址,由页面直接跳转
     */
    public String setInfoWithToken(Object parameter){
        return setInfoWithToken(parameter,properties.getExpiresTime());
    }


    /**
     * 登录验证结束后,以token为key,用户信息为value,存入缓存,使用户信息和token关联起来
     * 自定义token有效期,单位为秒,需保证大于0,反之则会自动设置为默认有效期
     * @param parameter 与登录用户相关的信息,比如用户id
     * @return 返回回跳地址,由页面直接跳转
     */
    public String setInfoWithToken(Object parameter, long time){
        //从session中获取token和回跳地址
        String authToken = (String) session.getAttribute(Constant.SESSION_TOKEN_KEY);
        String redirectUri = (String) session.getAttribute(Constant.SESSION_REDIRECT_URI_KEY);
        if (StrUtil.isEmpty(authToken) || StrUtil.isEmpty(redirectUri)){
            throw new RuntimeException(Constant.SESSION_NO_HAVE_TOKEN_MSG);
        }
        //以token为key,将传进来的与用户关联的信息存入缓存
        cacheInstance.set(CacheKeyUtil.tokenKey(authToken),parameter,time>0?time:properties.getExpiresTime());
        //清除session中的回跳地址
        session.removeAttribute(Constant.SESSION_REDIRECT_URI_KEY);
        return redirectUri;
    }

    /**
     * 根据token获取其关联的信息,一般是用户信息
     * @param authToken token
     * @return
     */
    public Object getInfoByToken(String authToken){
        return cacheInstance.get(CacheKeyUtil.tokenKey(authToken));
    }

    /**
     * 获取存储在session中的token
     * @return
     */
    public String getToken(){
        return (String) session.getAttribute(Constant.SESSION_TOKEN_KEY);
    }

    /**
     * 校验缓存中是否包含某个token
     * @param token
     * @return
     */
    public boolean containsToken(String token){
        return cacheInstance.containsKey(CacheKeyUtil.tokenKey(token));
    }

    /**
     * 删除缓存中的某个token
     * @param token
     */
    public void delToken(String token){
        cacheInstance.del(CacheKeyUtil.tokenKey(token));
    }

    /**
     * 为缓存中的某个token指定失效时间
     * @param token
     * @param time
     * @return
     */
    public boolean expireToken(String token,long time){
        return cacheInstance.expire(CacheKeyUtil.tokenKey(token),time);
    }

}
